home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / bin / ucfr < prev    next >
Text File  |  2008-05-30  |  10KB  |  333 lines

  1. #! /bin/bash
  2. #                               -*- Mode: Sh -*- 
  3. # ucfr --- 
  4. # Author           : Manoj Srivastava ( srivasta@glaurung.internal.golden-gryphon.com ) 
  5. # Created On       : Tue Apr 11 11:09:15 2006
  6. # Created On Node  : glaurung.internal.golden-gryphon.com
  7. # Last Modified By : Manoj Srivastava
  8. # Last Modified On : Tue Apr 11 13:50:58 2006
  9. # Last Machine Used: glaurung.internal.golden-gryphon.com
  10. # Update Count     : 43
  11. # Status           : Unknown, Use with caution!
  12. # HISTORY          : 
  13. # Description      : 
  14. #
  15. # Register a configuration file as belonging to a package
  16. # arch-tag: 6e1d33fe-a930-41ce-8d0f-c87f87b19918
  17. #
  18.  
  19. # make sure we exit on error
  20. set -e
  21.  
  22. # set the version and revision
  23. progname=$(basename "$0")
  24.  
  25. ######################################################################
  26. ########                                                     #########
  27. ########              Utility functions                      #########
  28. ########                                                     #########
  29. ######################################################################
  30. setq() {
  31.     # Variable Value Doc_string
  32.     if [ "x$2" = "x" ]; then
  33.     echo >&2 "$progname: Unable to determine $3"
  34.     exit 1;
  35.     else
  36.     if [ "x$VERBOSE" != "x" ]; then
  37.         echo >&2 "$progname: $3 is $2";
  38.     fi
  39.     eval "$1=\"\$2\"";
  40.     fi
  41. }
  42.  
  43. withecho () {
  44.         echo " $@" >&2
  45.         "$@"
  46. }
  47.  
  48.  
  49. purge_from_registry () {
  50.     if [ ! -e "$statedir/registry" ]; then
  51.         echo >&2 "$progname: Internal error: $statedir/registry does not exist";
  52.         exit 6;
  53.     fi
  54.  
  55.     if [ $count -eq 0 ]; then
  56.         if [ "X$VERBOSE" != "X" ]; then
  57.             echo >&2 "$progname: Association already purged. No changes.";
  58.         fi
  59.         exit 0;
  60.     fi
  61.     old_pkg=$(egrep "[[:space:]]${safe_conf_file}$" "$statedir/registry" | \
  62.         awk '{print $1;}' );
  63.     if [ "$pkg" != "$old_pkg"  ]; then
  64.         echo >&2 "ucfr: Association belongs to $old_pkg, not $pkg";
  65.         if [ "X$FORCE" = "X" ]; then
  66.             echo >&2 "ucfr: Aborting";
  67.             exit 5;
  68.         fi
  69.     fi
  70.  
  71.     # OK, so we have something to purge.
  72.     for i in $(/usr/bin/seq 6 -1 0); do
  73.     if [ -e "${statedir}/registry.${i}" ]; then
  74.         if [ "X$docmd" = "XYES" ]; then
  75.         cp -f "${statedir}/registry.${i}"  "${statedir}/registry.$(($i+1))"
  76.         else 
  77.         echo cp -f "${statedir}/registry.${i}" "${statedir}/registry.$(($i+1))"
  78.         fi 
  79.     fi 
  80.     done
  81.     if [ "X$docmd" = "XYES" ]; then
  82.     cp -f "$statedir/registry"  "$statedir/registry.0" 
  83.     else
  84.     echo cp -f "$statedir/registry"  "$statedir/registry.0" 
  85.     fi
  86.     if [ "X$docmd" = "XYES" ]; then
  87.     set +e
  88.     if [ "X$VERBOSE" != "X" ]; then
  89.         echo "egrep -v [[:space:]]${safe_conf_file}$ $statedir/registry >\\"
  90.             echo "    $statedir/registry.tmp || true";
  91.     fi
  92.     #echo "egrep -v [[:space:]]${safe_conf_file}$ $statedir/registry"
  93.     egrep -v "[[:space:]]${safe_conf_file}$" "$statedir/registry" > \
  94.         "$statedir/registry.tmp" || true; 
  95.     if [ "X$docmd" = "XYES" ]; then
  96.         mv -f "$statedir/registry.tmp"  "$statedir/registry" 
  97.     else
  98.         echo mv -f "$statedir/registry.tmp"  "$statedir/registry"
  99.     fi
  100.     set -e
  101.     fi
  102. }
  103.  
  104. replace_in_registry () {
  105.     if [ ! -e "$statedir/registry" ]; then
  106.         echo >&2 "$progname: Internal error: $statedir/registry does not exist";
  107.         exit 6;
  108.     fi
  109.     if [ $count -eq 1 ]; then
  110.         old_pkg=$(egrep "[[:space:]]${safe_conf_file}$" "$statedir/registry" | \
  111.             awk '{print $1;}' );
  112.         
  113.         if [ "$pkg" != "$old_pkg" ]; then
  114.             if [ "X$FORCE" = "X" ]; then
  115.                 echo >&2 "$progname: Attempt from package $pkg  to take ${conf_file} away from package $old_pkg";
  116.                 echo >&2 "ucfr: Aborting.";
  117.                 exit 4;
  118.             fi
  119.         else
  120.             if [ "X$VERBOSE" != "X" ]; then
  121.                 echo >&2 "$progname: Association already recorded. No changes.";
  122.             fi
  123.             exit 0;
  124.         fi
  125.     fi
  126.     
  127.     for i in $(/usr/bin/seq 6 -1 0); do
  128.     if [ -e "${statedir}/registry.${i}" ]; then
  129.         if [ "X$docmd" = "XYES" ]; then
  130.         cp -f "${statedir}/registry.${i}" \
  131.             "${statedir}/registry.$(($i+1))"
  132.         else
  133.         echo cp -f "${statedir}/registry.${i}" \
  134.             "${statedir}/registry.$(($i+1))"
  135.         fi
  136.     fi
  137.     done
  138.     if [ "X$docmd" = "XYES" ]; then
  139.     cp -f "$statedir/registry"  "$statedir/registry.0" 
  140.     else
  141.     echo cp -f "$statedir/registry"  "$statedir/registry.0" 
  142.     fi
  143.     if [ "X$docmd" = "XYES" ]; then
  144.     set +e
  145.     if [ "X$VERBOSE" != "X" ]; then
  146.         echo "egrep -v \"[[:space:]]${safe_conf_file}$\" \"$statedir/registry\"  \\"
  147.             echo "    $statedir/registry.tmp || true"
  148.         echo "echo \"$pkg      $conf_file\" >> \"$statedir/registry.tmp\""
  149.         echo "mv -f  $statedir/registry.tmp $statedir/registry" 
  150.     fi
  151.     egrep -v "[[:space:]]${safe_conf_file}$" "$statedir/registry" > \
  152.         "$statedir/registry.tmp" || true; 
  153.     echo "$pkg      $conf_file" >>   "$statedir/registry.tmp"; 
  154.     mv -f "$statedir/registry.tmp"  "$statedir/registry" 
  155.     set -e
  156.     else
  157.     echo "egrep -v \"[[:space:]]${safe_conf_file}$\" \"$statedir/registry\"  \\"
  158.         echo "    $statedir/registry.tmp || true"
  159.     echo "echo \"$pkg      $conf_file\" >> \"$statedir/registry.tmp\""
  160.     echo "mv -f  $statedir/registry.tmp $statedir/registry" 
  161.     fi
  162. }
  163.  
  164.  
  165. usageversion () {
  166.         cat >&2 <<END
  167. Debian GNU/Linux $progname $pversion.
  168.            Copyright (C) 2002-2006 Manoj Srivastava.
  169. This is free software; see the GNU General Public Licence for copying
  170. conditions.  There is NO warranty.
  171.  
  172. Usage: $progname  [options] package_name path_for_configuration_file
  173. Options:
  174.      -h,     --help          print this message
  175.      -f      --force         Force the association, even if another package
  176.                              used to own the configuration file.
  177.      -d [n], --debug    [n]  Set the Debug level to N
  178.      -n,     --no-action     Dry run. No action is actually taken.
  179.      -v,     --verbose       Make the script verbose
  180.      -p,     --purge         Remove any reference to the package/file association 
  181.                              from the records
  182.              --state-dir bar Set the state directory to bar instead of the
  183.                              default '/var/lib/ucf'. Used mostly for testing.
  184. END
  185.     
  186. }
  187.  
  188. ######################################################################
  189. ########                                                     #########
  190. ########              Command line args                      #########
  191. ########                                                     #########
  192. ######################################################################
  193. #
  194. # Long term variables#
  195. #
  196. docmd='YES'
  197. action='withecho'
  198. action=
  199. DEBUG=0
  200. VERBOSE=''
  201. statedir='/var/lib/ucf';
  202. THREEWAY=
  203.  
  204. # Note that we use `"$@"' to let each command-line parameter expand to a
  205. # separate word. The quotes around `$@' are essential!
  206. # We need TEMP as the `eval set --' would nuke the return value of getopt.
  207. TEMP=`getopt -a -o hd::D::fnvp -n "$progname" \
  208.       --long help,debug::,DEBUG::,force,no-action,purge,verbose,state-dir: \
  209.              -- "$@"`
  210.  
  211. if [ $? != 0 ] ; then
  212.     echo "Error handling options.Terminating..." >&2 ;
  213.     exit 1 ;
  214. fi
  215.  
  216. # Note the quotes around `$TEMP': they are essential!
  217. eval set -- "$TEMP"
  218.  
  219. while true ; do
  220.     case "$1" in
  221.     -h|--help) usageversion;                        exit 0  ;;
  222.     -n|--no-action) action='echo'; docmd='NO';      shift   ;;
  223.     -v|--verbose) VERBOSE=1;                        shift   ;;
  224.     -f|--force)   FORCE=1;                          shift   ;;
  225.     --state-dir)  opt_state_dir="$2";               shift 2 ;;
  226.     -D|-d|--debug|--DEBUG)
  227.             # d has an optional argument. As we are in quoted mode,
  228.             # an empty parameter will be generated if its optional
  229.             # argument is not found.
  230.         case "$2" in
  231.         "") setq DEBUG 1    "The Debug value"; shift 2 ;;
  232.         *)  setq DEBUG "$2" "The Debug value"; shift 2 ;;
  233.         esac ;;
  234.         -p|--purge) PURGE=YES;                         shift   ;;
  235.     --)  shift ;                                   break   ;;
  236.     *) echo >&2 "$progname: Internal error!" ; exit 1 ;;
  237.     esac
  238. done
  239. # Need to run as root, or else the 
  240. if test $(id -u) != 0; then
  241.     if [ "$docmd" = "YES" ]; then
  242.         echo "$progname: Need to be run as root." >&2
  243.         echo "$progname: Setting up no action mode." >&2
  244.         action='echo'; 
  245.         docmd='NO'; 
  246.     fi
  247. fi
  248.  
  249. if [ $# != 2 ]; then
  250.     echo >&2 "$progname: *** ERROR: Need exactly two arguments, got $#";
  251.     echo >&2 ""
  252.     usageversion;
  253.     exit 0 ;
  254. fi
  255.  
  256. setq pkg  "$1" "The Package name";
  257. setq conf_file "$2" "The Configuration file";
  258.  
  259. safe_pkg=$(echo $pkg       | sed -e 's,+,\\+,')
  260. safe_conf_file=$(echo $conf_file | sed -e 's,+,\\+,')
  261.  
  262. case $safe_conf_file in
  263.     /*)
  264.         : echo fine
  265.         ;;
  266.     *)
  267.         echo >&2 "$progname: Need a fully qualified path for the file \"$safe_conf_file\""
  268.         # Don't exit with an error for etch'
  269.         exit 0;
  270. esac
  271.  
  272. # Load site defaults and over rides.
  273. if [ -f /etc/ucf.conf ]; then
  274.     . /etc/ucf.conf
  275. fi
  276.  
  277. # Command line, env variable, config file, or default
  278. if [ ! "x$opt_state_dir" = "x" ]; then
  279.     setq statedir "$opt_state_dir" "The State directory"
  280. elif [ ! "x$UCF_STATE_DIR" = "x" ]; then
  281.     setq statedir "$UCF_STATE_DIR" "The State directory"
  282. elif [ ! "x$conf_state_dir" = "x" ]; then
  283.     setq statedir "$conf_state_dir" "The State directory"
  284. else
  285.     setq statedir '/var/lib/ucf'  "The State directory"    
  286. fi
  287.  
  288. # VERBOSE of 0 is supposed to be the same as not setting VERBOSE
  289. if [ "X$VERBOSE" = "X0" ]; then
  290.     VERBOSE=''
  291. fi
  292.  
  293. #
  294. if [ -e "$statedir/registry" -a ! -w "$statedir/registry" ]; then
  295.     echo >&2 "$progname: do not have write privilege to the registry data"
  296.     if [ "X$docmd" = "XYES" ]; then
  297.     exit 1;
  298.     fi
  299. fi
  300.  
  301. # test and see if this file exists in the database
  302. if [ ! -d "$statedir" ]; then
  303.     mkdir -p "$statedir"
  304. fi
  305.  
  306. if [ ! -f "$statedir/registry" ]; then
  307.     touch "$statedir/registry"
  308. fi
  309.  
  310.  
  311. if [ "X$VERBOSE" != "X" ]; then
  312.     echo >&2 "$progname: The registry exists"
  313. fi
  314.  
  315. # sanity check
  316. count=$(egrep --count "[[:space:]]${safe_conf_file}$" "$statedir/registry") || true
  317.  
  318. if [ "$count" -ge 2 ]; then
  319.     echo >&2 "$progname: Corrupt registry: Duplicate entries for ${conf_file}";
  320.     egrep "[[:space:]]${safe_conf_file}$" "$statedir/registry";
  321.     exit $count;
  322. fi
  323.  
  324. if [ "X$PURGE" != "X" ]; then
  325.     purge_from_registry $pkg $conf_file;
  326. else
  327.     replace_in_registry $pkg $conf_file;
  328. fi
  329.  
  330.  
  331. exit 0;
  332.